/* 

给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。

必须在原数组上操作，不能拷贝额外的数组。
尽量减少操作次数。


示例：
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

*/

/* 
思路1：遍历一遍，对为0的项计数，不为0的项放入新数组中  (不符合操作原数组的要求)

思路2：
快指针R遍历数组，每次+1
快指针R指非0，慢指针L +1
快指针R指　0，慢指针L停在0
直到快指针R指非0，交换，慢指针L +1
*/

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
    //  思路1
    /* const n= nums.length
    let ret=[],count=0
    for (let i = 0; i < n; i++) {
        if(nums[i]==0){
            count++
        }else{
            ret.push(nums[i])
        }
    }
    for (let j = 0; j < count; j++) {
        ret.push(0)
    }
    return ret */

    // 思路2
    const n = nums.length
    let left = 0, right = 0
    while (right < n) {
        if (nums[right] !== 0) {
            let temp = nums[right]
            nums[right] = nums[left]
            nums[left] = temp
            left++
        }
        right++
    }

};


/* 

*/

// 运行
let nums = [1, 1, 0, 3, 12]
moveZeroes(nums)
console.log(nums);